import { fileURLToPath, URL } from "node:url";
import { viteMockServe } from "vite-plugin-mock";
import { ConfigEnv, defineConfig, loadEnv, UserConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueDevTools from "vite-plugin-vue-devtools";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import UnoCSS from "unocss/vite";

// https://vite.dev/config/
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  // 获取当前工作目录
  const root = process.cwd();
  // 获取环境变量
  const env = loadEnv(mode, root);
  console.log("🚀 ~ defineConfig ~ env:", env);

  return {
    // 项目根目录
    root,
    // 项目部署基础路径
    base: "./",
    publicDir: fileURLToPath(new URL("./public", import.meta.url)), //打包无需处理的静态资源
    assetsInclude: fileURLToPath(new URL("./src/assets", import.meta.url)), //打包需要处理的静态资源

    // 插件
    plugins: [
      vue(),
      UnoCSS(),
      vueDevTools(),
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
      viteMockServe({
        // 如果接口为 /mock/xxx 以 mock 开头就会被拦截响应配置的内容
        mockPath: "mock", // 数据模拟需要拦截的请求起始 URL
        enable: Boolean(Number(env.VITE_APP_USE_MOCK) === 1), // 本地开发是否启用
      }),
    ],
    resolve: {
      // 路径别名
      alias: {
        "@": fileURLToPath(new URL("./src", import.meta.url)),
        "#": fileURLToPath(new URL("./types", import.meta.url)),
      },
    },
    // 运行后本地预览的服务器
    server: {
      // 指定服务器应该监听哪个 IP 地址。 如果将此设置为 0.0.0.0 或者 true 将监听所有地址，包括局域网和公网地址。
      host: true,
      // 开发环境预览服务器端口
      port: 3000,
      // 启动后是否自动打开浏览器
      open: false,
      // 是否开启CORS跨域
      cors: true,
      // 代理服务器
      // 帮助我们开发时解决跨域问题
      proxy: {
        // 这里的意思是 以/api开头发送的请求都会被转发到 http://xxx:3000
        "/loacl": {
          target: "http://127.0.0.1:3007",
          // 改变 Host Header
          changeOrigin: true,
          // 发起请求时将 '/api' 替换为 ''  是否需要替换根据实际情况来
          rewrite: (path) => path.replace(/^\/loacl/, "/api"),
        },
        // 这里的意思是 以/mock开头发送的请求都会被转发到 http://xxx:3000
        // [env.VITE_APP_MOCK_BASEURL]: {
        //   target: "http://localhost:9000",
        //   changeOrigin: true,
        // },
      },
    },
    build: {
      // 打包大小超出1000kb警告
      chunkSizeWarningLimit: 1000,
      // 关闭 sourcemap 报错不会映射到源码，仅生产建议关闭
      sourcemap: true,

      rollupOptions: {
        // 打包入口文件
        input: {
          index: fileURLToPath(new URL("./index.html", import.meta.url)),
        },

        // 静态资源分类打包
        output: {
          format: "esm",
          chunkFileNames: "static/js/[name]-[hash].js",
          entryFileNames: "static/js/[name]-[hash].js",
          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
        },
      },
    },
  };
});
